/*
 * TerminosEnMemoria.h
 *
 *  Created on: 27/11/2011
 *      Author: putaro
 */

#include "Parser.h"
#include "AsistenteObtencionDeTerminos.h"
#include <vector>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <fstream>

#ifndef TERMINOSENMEMORIA_H_
#define TERMINOSENMEMORIA_H_

#define TAM_MAX_APROX_BUFFER_TERMINOS 1024

using namespace std;

//estructura del archivo generado
typedef struct registroTerminosEnMemoria{
	unsigned int documento;
	unsigned int offset;
}T_RegistroTerminosEnMemoria;

/*
 * Una instancia de esta clase permite mantener en memoria una cierta cantidad de términos
 * en memoria virtual, junto con sus respectivos datos.
 */
class TerminosEnMemoria {

private:

	vector<string> bufferTerminos;

	vector<registroTerminosEnMemoria> datosTerminos;

	ifstream archivo;

	unsigned int tamBufferTerminos;

	unsigned int cantidadTerminos;

public:

	/*
	 * Pre:-
	 * Post: Se ha creado una instancia de la clase lista para ser utilizada.
	 */
	TerminosEnMemoria(const string & directorioArchivosParser);



	/*
	 * Pre: Se ha creado la instancia.
	 * Post: La instancia ha sido destruido liberando los recursos asociados.
	 */
	virtual ~TerminosEnMemoria();

	/*
	 * Pre: La instancia ha sido creada.
	 * Post: Se ha cargado una nueva serie de terminos en memoria.
	 */
	bool cargarNuevosTerminos();

	/*
	 * Pre: La instancia ha sido creada.
	 * Post: Se ha ordenado por quicksort los datos contenidos en la instancia.
	 * Dicho ordenamiento consiste en la reorganización del atributo datosTerminos
	 * de menor a mayor.
	 * Se ordena por termino y documento.
	 */
	void quickSort();

	unsigned int cantidadDeTerminos();

	vector<string> getBufferTerminos();

	vector<registroTerminosEnMemoria> getDatosTerminos();

private:

	/*
	 * Pre: La instancia ha sido creada.
	 * Post: Se ha ordenado por quicksort los datos contenidos en la instancia.
	 * Dicho ordenamiento consiste en la reorganización del atributo datosTerminos
	 * de menor a mayor.
	 * Se ordena por termino y documento.
	 */
	void quickSort(const int primero, const int ultimo);

	int colocar(const int primero, const int ultimo);

	bool isMenor(const unsigned posicionEnDatos , const T_RegistroTerminosEnMemoria & registro);
};

#endif /* TERMINOSENMEMORIA_H_ */
